home *** CD-ROM | disk | FTP | other *** search
-
- =================================
- termwrap.so dynamic shared object
- =================================
-
- *** Only for Solaris 2.x ***
-
-
- Two line description:
- It uses the cool Solaris dynamic linking facilities to allow networking
- programs to use TERM without having to be recompiled or changed at all.
-
-
- HOW TO USE IT
- =============
-
- Any networking program which could be ported to use TERM by including
- "termnet.h" and linking with libtermnet.a can be used "as is" with
- termwrap.so. Programs which I have verified include:
-
- Solaris's telnet
- Solaris's finger
- xarchie from ftp.x.org
-
- When libtermnet.a matures and supports a more complete set of networking
- functions, other programs like Netscape and Solaris's FTP will also
- work (magically, without recompilation, of course :-)
-
-
- Once TERM is installed and running, simply do:
-
- termwrap program args_to_program
-
- eg: termwrap telnet some_remote_hostname
-
- (If you installed TERM into a non-standard place you will need to set the
- TERMWRAP environment variable to the location of termwrap.so first).
-
- "termwrap" executes "program" under TERM mode. It simply sets LD_PRELOAD
- to the termwrap.so dynamic shared object, then exec's "program".
-
- If TERM was installed in "shared mode" (eg: make installshare), then
- "termwrap" will have been installed setgid and you will get TERM shared
- mode, just as if you'd recompiled "program" with libtermnet.a and changed
- its modes to setgid term.
-
- Note that setuid and setgid programs cannot work with termwrap.so
- because LD_PRELOAD is ignored for such programs. "rlogin" is an example
- of such a program.
-
-
-
- ERRORS
- ======
- If, when you run a program under termwrap, you get errors such as:
-
- ld.so.1: program: fatal: relocation error: symbol not found: h_errno:
- referenced in /usr/local/lib/termwrap.so
-
- then "program" is not a networking program (it is not linked with libsocket
- and libnsl). Such programs cannot support TERM.
-
- If the program appears to start up correctly, but does not work properly,
- or core dumps, or seems to be confused, or simply doesn't work at all,
- then it probably uses networking functions which libtermnet doesn't
- emulate. Such a program couldn't be ported by using "termnet.h" and
- lintermnet.a, and therefore cannot be used with termwrap. An example of
- such a program is netscape. It runs, and seems to be ok, but it can't
- find any hosts over the TERM connection. Obviously it uses some functions
- which libtermnet.a doesn't emulate... perhaps from libresolv? Similarly,
- Solaris's FTP seems to work correctly during the login process etc, but
- cannot "see" any files at the remote site... See Term.HOWTO for a list of
- alternative programs you might consider using instead.
-
-
-
- HOW IT WORKS
- ============
-
- termwrap.so has three parts:
-
- termwrapin.c
- ============
- A set of functions with identical names to those in libsocket and libnsl.
- These pass control to the libtermnet functions term_* (just as if
- they had been defined using termnet.h).
-
- termwrapout.c
- =============
- A set of functions which match the above functions but have "x__"
- prepended to their names. These functions do interposing using dlsym().
- They call functions with same names as the ones defined in termwrapin.c,
- but NOT THOSE FUNCTIONS. Instead, they call the "real" functions in
- libsocket/libnsl. (For a description of interposing, see the Solaris
- Linker & Libraries Answerbook).
-
- the files which make up libtermnet
- ==================================
- these provide the term_* emulation functions.
-
-
- In summary, here is what happens:
-
- NORMAL NETWORKING PROGRAM (NO TERM)
- ===================================
-
- program calls networking function
- |
- V
- libsocket or libnsl performs networking function
-
-
- NETWORKING PROGRAM WHEN LD_PRELOAD=/usr/local/lib/termwrap.so
- =============================================================
-
- program calls networking function
- |
- V
- termwrap.so(termwrapin.c) intercepts function because of LD_PRELOAD,
- and calls term_*
- |
- V
- term_* does the actual talking to term by calling x__* funcs.
- | | |
- V V V
- x__* (in termwrapout.c) uses dlsym(RTLD_NEXT,"*") to find the
- real socket function which libtermnet thought it was calling
- and calls that. Ta Da!
-
-
- As a picture it would look like this:
-
- networking program
- V ^
- V ^
- +----------------V-------------^-----------+
- | termwrapin.c V ^ |
- +----------------V-------------^-----------+
- | |
- | libtermnet |
- | |
- +------------------V-^-V-^-V-^-------------+
- | termwrapout.c V ^ V ^ V ^ |
- +------------------V-^-V-^-V-^-------------+
- V ^ V ^ V ^
- V ^ V ^ V ^
- libsocket and libnsl
-
- Time ----> ----> ----> ----> ---->
-
-
- If after all that explaining I've only managed to confuse you, check out
- the section on "Interposing" in the "Solaris Linker & Libraries Answerbook".
-
- Feel free to email me if you have any questions...
-
-
- JASON PATTERSON (jasonp@fit.qut.edu.au)
-